以Java為例:
int x
在宣告x變數時,使用了int這個關鍵字讓x的型別定在數字型別,而不能更改,如果企圖更改放入非整數的值 :
int x
x = 'hi'
編譯時就會出現以下錯誤
HelloWorld.java:5: error: incompatible types: String cannot be converted to int
靜態型別的語言十分嚴謹,在語法撰寫時會相對麻煩(以JavaScript的角度看XD),但相對的可以減少很多因為型別所導致的Bug。
以JavaScript為例子:
let y = 100
y = '100'
在JavaScript中,在編寫的過程中可以任意變更變數的型別,在執行(Runtime)時並不會報錯。
一樣以Java為例:
int x = 100 + "100"
System.out.println(x)
出現編譯錯誤:
HelloWorld.java:4: error: incompatible types: String cannot be converted to int
Java並不會自動轉換型別去加總,如果是想要實現100+100的效果,可以使用以下方法:
int x = 100 + Integer.parseInt("100");
System.out.println(x); // 200
這就是所謂的強型別,不會隱性的轉換變數的型別。
一樣以JavaScript為例子:
let a = 123 + "456";
console.log(a) // 123456
成功執行,並且沒有錯誤訊息,只是JavaScript預設會把數字轉換為字串,如果目標是123+456的話可以使用以下方法:
let a = 123 + Number("456")
console.log(a) // 579
弱型別最常導致Bug的情況,除了混用不同型別去做數學運算或是字串的串接,另一個就是允許不同型別的比較:
let a = 123
let b = "123"
console.log(a==b,a===b) // true, false
以一張圖可以清楚知道常見的語言型別特性
(Source:動態語言、靜態語言、強型別和弱型別)
透過以上的介紹可以知道JavaScript是屬於動態弱型別語言,這樣的組合讓JavaScript在撰寫上相對鬆散與不安全,但是JavaScript終究是動態網頁不可缺少的角色,這也是為什麼TypeScript的出現,長期而言,在一些大型專案有助於開發與維護的穩定性。
參考資料: